package com.igeek.list;

import com.igeek.bean.Student;

import java.util.*;

/**
 * List集合：
 *       ArrayList：查询快，增删慢，有序的，允许重复
 *       LinkedList：查询慢，增删快，无序的，允许重复
 * 集合的特点：长度可变，可以存放不同数据类型
 * 但是在开发中，不建议在集合中存放不同数据类型的数，因为，在取元素的时候涉及到数据类型转换问题，容易报错
 * 所以，为了避免上述问题，引出了泛型的概念，即，规定了集合存储的数据类型
 *
 */
public class Demo01 {

    public static void main(String[] args) {
        List list01 = new ArrayList();
        ArrayList list = new ArrayList();

        list.add(10);
        list.add("hello");
        list.add(new Student());

        /*Object o = list.get(0);
        int values = (int)list.get(1);*/

        //通过泛型规定集合存放的数据类型
        ArrayList<String> list02 = new ArrayList<>();
        list02.add("1");

        /*
            ArrayList 提供的方法
            增：
                add()  在集合后面追加数据
                add(int,object)  第一个参数指定元素添加的位置，第二个元素是要添加的数据
                                 注意：指定的索引位置不能超过 原集合长度-1
                addAll(collection)
                addAll(index,collection)
            删：
                clear() 清空
                remove(int) 根据指定的索引值位置进行移除 指定的索引位置不能超过 原集合长度-1
                remove(object) 根据元素值进行删除
                               注意：使用引用数据类型的对象进行remove时，需要重写该引用类的equals()方法
                                    那么，做remove(Object)删除时，就会比较传入对象中的属性，如果匹配则会删除元素
                                    总结一个规律：在集合中通过对象比较时，都是调用对象中的equals()方法来实现

            改：
                set(int,object) 根据指定的索引位置，修改元素值 指定的索引位置不能超过 原集合长度-1

            查：
                get(int) 根据索引位置查询元素 指定的索引位置不能超过 原集合长度-1

            其他：
                isEmpty() 判断集合是否为空
                size() 判断集合的长度
                indexOf() 集合元素首次出现的索引位置，如果没有返回-1
                lastIndexOf() 集合元素最后一次出现的索引位置，如果没有返回-1

         */
        list02.add("2");
        list02.add(0,"3");

        //IndexOutOfBoundsException
//        list02.add(4,"4");
        System.out.println(list02.toString());

        list02.addAll(list01);

//        list02.clear();


//        list02.remove(4);


        System.out.println(list02.remove("1"));

        list02.set(0,"11");
        System.out.println(list02.toString());
        System.out.println(list02.get(0));

        ArrayList<Student> list03 = new ArrayList<>();
        Student s01 = new Student(12,"001");
        Student s02 = new Student(13,"002");
        list03.add(s01);
        list03.add(s02);
        list03.add(new Student(11,"003"));
        list03.add(new Student(11,"004"));
        System.out.println(list03);
//        list03.remove(s02);
        list03.remove(new Student(13,"002"));
        System.out.println(list03);


        /*
            集合的遍历：
                iterator() 方法，对集合进行遍历，返回一个Iterator类型的对象，这个对象提供了三个方法：
                    hasNext() 返回值为Boolean 判断是否有下一个元素
                    next()    返回下一个元素（当前遍历的元素）
                    remove()  移除元素
                注意：集合在遍历的时候，不可以对其长度做更改，即，在遍历时，不能调用集合提供的remove() add()方法
                     如果想在遍历集合的时候，做元素的删除，只能通过Iterator对象提供的 remove()
                增强for循环
                    语法：
                        for(集合元素的类型变量 : 集合对象){
                            在循环体中，获取每次遍历的元素
                        }
         */
        Iterator<Student> it = list03.iterator();
        while(it.hasNext()){
            Student stu = it.next();
            if("004".equals(stu.getStuNo())){
                it.remove();
//                list03.remove(new Student(11,"004"));  //报错ConcurrentModificationException
//                list03.add(new Student(11,"005"));     //报错ConcurrentModificationException
            }
        }

        for(Student student : list03){
            System.out.println(student);
        }
        System.out.println(list03);

        /*
            对集合对象的判空，避免空指针的问题
         */
        if(list03 != null && !list03.isEmpty()){

        }

        if(list03 != null && list03.size() > 0){

        }
    }
}
